scitex 2.0.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
scitex/dsp/__init__.py
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex dsp module."""
|
|
3
|
+
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
# Core imports that should always work
|
|
7
|
+
from ._crop import crop
|
|
8
|
+
from ._demo_sig import demo_sig
|
|
9
|
+
from ._detect_ripples import detect_ripples, _preprocess, _find_events, _drop_ripples_at_edges, _calc_relative_peak_position, _sort_columns
|
|
10
|
+
from ._ensure_3d import ensure_3d
|
|
11
|
+
from ._hilbert import hilbert
|
|
12
|
+
from ._modulation_index import modulation_index, _reshape
|
|
13
|
+
from ._pac import pac
|
|
14
|
+
from ._psd import band_powers, psd
|
|
15
|
+
from ._resample import resample
|
|
16
|
+
from ._time import time
|
|
17
|
+
from ._transform import to_segments, to_sktime_df
|
|
18
|
+
from ._wavelet import wavelet
|
|
19
|
+
|
|
20
|
+
# Import example and params modules as submodules
|
|
21
|
+
from . import example
|
|
22
|
+
from . import params
|
|
23
|
+
|
|
24
|
+
# Try to import audio-related functions that require PortAudio
|
|
25
|
+
try:
|
|
26
|
+
from ._listen import list_and_select_device
|
|
27
|
+
_audio_available = True
|
|
28
|
+
except (ImportError, OSError) as e:
|
|
29
|
+
warnings.warn(
|
|
30
|
+
"Audio functionality unavailable: PortAudio library not found. "
|
|
31
|
+
"Install PortAudio to use audio features (e.g., sudo apt-get install portaudio19-dev)",
|
|
32
|
+
ImportWarning
|
|
33
|
+
)
|
|
34
|
+
list_and_select_device = None
|
|
35
|
+
_audio_available = False
|
|
36
|
+
|
|
37
|
+
# Try to import MNE-related functions
|
|
38
|
+
try:
|
|
39
|
+
from ._mne import get_eeg_pos
|
|
40
|
+
_mne_available = True
|
|
41
|
+
except ImportError:
|
|
42
|
+
warnings.warn(
|
|
43
|
+
"MNE functionality unavailable. Install MNE-Python to use EEG position features.",
|
|
44
|
+
ImportWarning
|
|
45
|
+
)
|
|
46
|
+
get_eeg_pos = None
|
|
47
|
+
_mne_available = False
|
|
48
|
+
|
|
49
|
+
__all__ = [
|
|
50
|
+
"_calc_relative_peak_position",
|
|
51
|
+
"_drop_ripples_at_edges",
|
|
52
|
+
"_find_events",
|
|
53
|
+
"_preprocess",
|
|
54
|
+
"_reshape",
|
|
55
|
+
"_sort_columns",
|
|
56
|
+
"band_powers",
|
|
57
|
+
"crop",
|
|
58
|
+
"demo_sig",
|
|
59
|
+
"detect_ripples",
|
|
60
|
+
"ensure_3d",
|
|
61
|
+
"get_eeg_pos",
|
|
62
|
+
"hilbert",
|
|
63
|
+
"list_and_select_device",
|
|
64
|
+
"modulation_index",
|
|
65
|
+
"pac",
|
|
66
|
+
"psd",
|
|
67
|
+
"resample",
|
|
68
|
+
"time",
|
|
69
|
+
"to_segments",
|
|
70
|
+
"to_sktime_df",
|
|
71
|
+
"wavelet",
|
|
72
|
+
]
|
scitex/dsp/_crop.py
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "ywatanabe (2024-11-02 22:50:46)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/dsp/_crop.py
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def crop(sig_2d, window_length, overlap_factor=0.0, axis=-1, time=None):
|
|
10
|
+
"""
|
|
11
|
+
Crops the input signal into overlapping windows of a specified length,
|
|
12
|
+
allowing for an arbitrary axis and considering a time vector.
|
|
13
|
+
|
|
14
|
+
Parameters:
|
|
15
|
+
- sig_2d (numpy.ndarray): The input sig_2d array to be cropped. Can be multi-dimensional.
|
|
16
|
+
- window_length (int): The length of each window to crop the sig_2d into.
|
|
17
|
+
- overlap_factor (float): The fraction of the window that consecutive windows overlap. For example, an overlap_factor of 0.5 means 50% overlap.
|
|
18
|
+
- axis (int): The time axis along which to crop the sig_2d.
|
|
19
|
+
- time (numpy.ndarray): The time vector associated with the signal. Its length should match the signal's length along the cropping axis.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
- cropped_windows (numpy.ndarray): The cropped signal windows. The shape depends on the input shape and the specified axis.
|
|
23
|
+
"""
|
|
24
|
+
# Ensure axis is in a valid range
|
|
25
|
+
if axis < 0:
|
|
26
|
+
axis += sig_2d.ndim
|
|
27
|
+
if axis >= sig_2d.ndim or axis < 0:
|
|
28
|
+
raise ValueError("Invalid axis. Axis out of range for sig_2d dimensions.")
|
|
29
|
+
|
|
30
|
+
if time is not None:
|
|
31
|
+
# Validate the length of the time vector against the signal's dimension
|
|
32
|
+
if sig_2d.shape[axis] != len(time):
|
|
33
|
+
raise ValueError(
|
|
34
|
+
"Length of time vector does not match signal's dimension along the specified axis."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Move the target axis to the last position
|
|
38
|
+
axes = np.arange(sig_2d.ndim)
|
|
39
|
+
axes[axis], axes[-1] = axes[-1], axes[axis]
|
|
40
|
+
sig_2d_permuted = np.transpose(sig_2d, axes)
|
|
41
|
+
|
|
42
|
+
# Compute the number of windows and the step size
|
|
43
|
+
seq_len = sig_2d_permuted.shape[-1]
|
|
44
|
+
step = int(window_length * (1 - overlap_factor))
|
|
45
|
+
n_windows = max(
|
|
46
|
+
1, ((seq_len - window_length) // step + 1)
|
|
47
|
+
) # Ensure at least 1 window
|
|
48
|
+
|
|
49
|
+
# Crop the sig_2d into windows
|
|
50
|
+
cropped_windows = []
|
|
51
|
+
cropped_times = []
|
|
52
|
+
for i in range(n_windows):
|
|
53
|
+
start = i * step
|
|
54
|
+
end = start + window_length
|
|
55
|
+
cropped_windows.append(sig_2d_permuted[..., start:end])
|
|
56
|
+
if time is not None:
|
|
57
|
+
cropped_times.append(time[start:end])
|
|
58
|
+
|
|
59
|
+
# Convert list of windows back to numpy array
|
|
60
|
+
cropped_windows = np.array(cropped_windows)
|
|
61
|
+
cropped_times = np.array(cropped_times)
|
|
62
|
+
|
|
63
|
+
# Move the last axis back to its original position if necessary
|
|
64
|
+
if axis != sig_2d.ndim - 1:
|
|
65
|
+
# Compute the inverse permutation
|
|
66
|
+
inv_axes = np.argsort(axes)
|
|
67
|
+
cropped_windows = np.transpose(cropped_windows, axes=inv_axes)
|
|
68
|
+
|
|
69
|
+
if time is None:
|
|
70
|
+
return cropped_windows
|
|
71
|
+
else:
|
|
72
|
+
return cropped_windows, cropped_times
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def main():
|
|
76
|
+
import random
|
|
77
|
+
|
|
78
|
+
FS = 128
|
|
79
|
+
N_CHS = 19
|
|
80
|
+
RECORD_S = 13
|
|
81
|
+
WINDOW_S = 2
|
|
82
|
+
FACTOR = 0.5
|
|
83
|
+
|
|
84
|
+
# To pts
|
|
85
|
+
record_pts = int(RECORD_S * FS)
|
|
86
|
+
window_pts = int(WINDOW_S * FS)
|
|
87
|
+
|
|
88
|
+
# Demo signal
|
|
89
|
+
sig2d = np.random.rand(N_CHS, record_pts)
|
|
90
|
+
time = np.arange(record_pts) / FS
|
|
91
|
+
|
|
92
|
+
# Main
|
|
93
|
+
xx, tt = crop(sig2d, window_pts, overlap_factor=FACTOR, time=time)
|
|
94
|
+
|
|
95
|
+
print(f"sig2d.shape: {sig2d.shape}")
|
|
96
|
+
print(f"xx.shape: {xx.shape}")
|
|
97
|
+
|
|
98
|
+
# Validation
|
|
99
|
+
i_seg = random.randint(0, len(xx) - 1)
|
|
100
|
+
start = int(i_seg * window_pts * FACTOR)
|
|
101
|
+
end = start + window_pts
|
|
102
|
+
assert np.allclose(sig2d[:, start:end], xx[i_seg])
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
# parser = argparse.ArgumentParser(description='')
|
|
107
|
+
# import argparse
|
|
108
|
+
# # Argument Parser
|
|
109
|
+
import sys
|
|
110
|
+
|
|
111
|
+
import matplotlib.pyplot as plt
|
|
112
|
+
import scitex
|
|
113
|
+
|
|
114
|
+
# parser.add_argument('--var', '-v', type=int, default=1, help='')
|
|
115
|
+
# parser.add_argument('--flag', '-f', action='store_true', default=False, help='')
|
|
116
|
+
# args = parser.parse_args()
|
|
117
|
+
# Main
|
|
118
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt, verbose=False)
|
|
119
|
+
main()
|
|
120
|
+
scitex.gen.close(CONFIG, verbose=False, notify=False)
|
|
121
|
+
|
|
122
|
+
# EOF
|
scitex/dsp/_demo_sig.py
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-06 01:45:32 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/dsp/_demo_sig.py
|
|
5
|
+
|
|
6
|
+
import random
|
|
7
|
+
import sys
|
|
8
|
+
import warnings
|
|
9
|
+
|
|
10
|
+
import matplotlib.pyplot as plt
|
|
11
|
+
import mne
|
|
12
|
+
import numpy as np
|
|
13
|
+
from mne.datasets import sample
|
|
14
|
+
from ripple_detection.simulate import simulate_LFP, simulate_time
|
|
15
|
+
from scipy.signal import chirp
|
|
16
|
+
from tensorpac.signals import pac_signals_wavelet
|
|
17
|
+
|
|
18
|
+
from ..io._load_configs import load_configs
|
|
19
|
+
|
|
20
|
+
# Config
|
|
21
|
+
CONFIG = load_configs(verbose=False)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Functions
|
|
25
|
+
def demo_sig(
|
|
26
|
+
sig_type="periodic",
|
|
27
|
+
batch_size=8,
|
|
28
|
+
n_chs=19,
|
|
29
|
+
n_segments=20,
|
|
30
|
+
t_sec=4,
|
|
31
|
+
fs=512,
|
|
32
|
+
freqs_hz=None,
|
|
33
|
+
verbose=False,
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Generate demo signals for various signal types.
|
|
37
|
+
|
|
38
|
+
Parameters:
|
|
39
|
+
-----------
|
|
40
|
+
sig_type : str, optional
|
|
41
|
+
Type of signal to generate. Options are "uniform", "gauss", "periodic", "chirp", "ripple", "meg", "tensorpac", "pac".
|
|
42
|
+
Default is "periodic".
|
|
43
|
+
batch_size : int, optional
|
|
44
|
+
Number of batches to generate. Default is 8.
|
|
45
|
+
n_chs : int, optional
|
|
46
|
+
Number of channels. Default is 19.
|
|
47
|
+
n_segments : int, optional
|
|
48
|
+
Number of segments for tensorpac and pac signals. Default is 20.
|
|
49
|
+
t_sec : float, optional
|
|
50
|
+
Duration of the signal in seconds. Default is 4.
|
|
51
|
+
fs : int, optional
|
|
52
|
+
Sampling frequency in Hz. Default is 512.
|
|
53
|
+
freqs_hz : list or None, optional
|
|
54
|
+
List of frequencies in Hz for periodic signals. If None, random frequencies will be used.
|
|
55
|
+
verbose : bool, optional
|
|
56
|
+
If True, print additional information. Default is False.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
--------
|
|
60
|
+
tuple
|
|
61
|
+
A tuple containing:
|
|
62
|
+
- np.ndarray: Generated signal(s) with shape (batch_size, n_chs, time_samples) or (batch_size, n_chs, n_segments, time_samples) for tensorpac and pac signals.
|
|
63
|
+
- np.ndarray: Time array.
|
|
64
|
+
- int: Sampling frequency.
|
|
65
|
+
"""
|
|
66
|
+
assert sig_type in [
|
|
67
|
+
"uniform",
|
|
68
|
+
"gauss",
|
|
69
|
+
"periodic",
|
|
70
|
+
"chirp",
|
|
71
|
+
"ripple",
|
|
72
|
+
"meg",
|
|
73
|
+
"tensorpac",
|
|
74
|
+
"pac",
|
|
75
|
+
]
|
|
76
|
+
tt = np.linspace(0, t_sec, int(t_sec * fs), endpoint=False)
|
|
77
|
+
|
|
78
|
+
if sig_type == "uniform":
|
|
79
|
+
return (
|
|
80
|
+
np.random.uniform(low=-0.5, high=0.5, size=(batch_size, n_chs, len(tt))),
|
|
81
|
+
tt,
|
|
82
|
+
fs,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
elif sig_type == "gauss":
|
|
86
|
+
return np.random.randn(batch_size, n_chs, len(tt)), tt, fs
|
|
87
|
+
|
|
88
|
+
elif sig_type == "meg":
|
|
89
|
+
return (
|
|
90
|
+
_demo_sig_meg(
|
|
91
|
+
batch_size=batch_size,
|
|
92
|
+
n_chs=n_chs,
|
|
93
|
+
t_sec=t_sec,
|
|
94
|
+
fs=fs,
|
|
95
|
+
verbose=verbose,
|
|
96
|
+
).astype(np.float32)[..., : len(tt)],
|
|
97
|
+
tt,
|
|
98
|
+
fs,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
elif sig_type == "tensorpac":
|
|
102
|
+
xx, tt = _demo_sig_tensorpac(
|
|
103
|
+
batch_size=batch_size,
|
|
104
|
+
n_chs=n_chs,
|
|
105
|
+
n_segments=n_segments,
|
|
106
|
+
t_sec=t_sec,
|
|
107
|
+
fs=fs,
|
|
108
|
+
)
|
|
109
|
+
return xx.astype(np.float32)[..., : len(tt)], tt, fs
|
|
110
|
+
|
|
111
|
+
elif sig_type == "pac":
|
|
112
|
+
xx = _demo_sig_pac(
|
|
113
|
+
batch_size=batch_size,
|
|
114
|
+
n_chs=n_chs,
|
|
115
|
+
n_segments=n_segments,
|
|
116
|
+
t_sec=t_sec,
|
|
117
|
+
fs=fs,
|
|
118
|
+
)
|
|
119
|
+
return xx.astype(np.float32)[..., : len(tt)], tt, fs
|
|
120
|
+
|
|
121
|
+
else:
|
|
122
|
+
fn_1d = {
|
|
123
|
+
"periodic": _demo_sig_periodic_1d,
|
|
124
|
+
"chirp": _demo_sig_chirp_1d,
|
|
125
|
+
"ripple": _demo_sig_ripple_1d,
|
|
126
|
+
}.get(sig_type)
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
(
|
|
130
|
+
np.array(
|
|
131
|
+
[
|
|
132
|
+
fn_1d(
|
|
133
|
+
t_sec=t_sec,
|
|
134
|
+
fs=fs,
|
|
135
|
+
freqs_hz=freqs_hz,
|
|
136
|
+
verbose=verbose,
|
|
137
|
+
)
|
|
138
|
+
for _ in range(int(batch_size * n_chs))
|
|
139
|
+
]
|
|
140
|
+
)
|
|
141
|
+
.reshape(batch_size, n_chs, -1)
|
|
142
|
+
.astype(np.float32)[..., : len(tt)]
|
|
143
|
+
),
|
|
144
|
+
tt,
|
|
145
|
+
fs,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _demo_sig_pac(
|
|
150
|
+
batch_size=8,
|
|
151
|
+
n_chs=19,
|
|
152
|
+
t_sec=4,
|
|
153
|
+
fs=512,
|
|
154
|
+
f_pha=10,
|
|
155
|
+
f_amp=100,
|
|
156
|
+
noise=0.8,
|
|
157
|
+
n_segments=20,
|
|
158
|
+
verbose=False,
|
|
159
|
+
):
|
|
160
|
+
"""
|
|
161
|
+
Generate a demo signal with phase-amplitude coupling.
|
|
162
|
+
Parameters:
|
|
163
|
+
batch_size (int): Number of batches.
|
|
164
|
+
n_chs (int): Number of channels.
|
|
165
|
+
t_sec (int): Duration of the signal in seconds.
|
|
166
|
+
fs (int): Sampling frequency.
|
|
167
|
+
f_pha (float): Frequency of the phase-modulating signal.
|
|
168
|
+
f_amp (float): Frequency of the amplitude-modulated signal.
|
|
169
|
+
noise (float): Noise level added to the signal.
|
|
170
|
+
n_segments (int): Number of segments.
|
|
171
|
+
verbose (bool): If True, print additional information.
|
|
172
|
+
Returns:
|
|
173
|
+
np.array: Generated signals with shape (batch_size, n_chs, n_segments, seq_len).
|
|
174
|
+
"""
|
|
175
|
+
seq_len = t_sec * fs
|
|
176
|
+
t = np.arange(seq_len) / fs
|
|
177
|
+
if verbose:
|
|
178
|
+
print(f"Generating signal with length: {seq_len}")
|
|
179
|
+
|
|
180
|
+
# Create empty array to store the signals
|
|
181
|
+
signals = np.zeros((batch_size, n_chs, n_segments, seq_len))
|
|
182
|
+
|
|
183
|
+
for b in range(batch_size):
|
|
184
|
+
for ch in range(n_chs):
|
|
185
|
+
for seg in range(n_segments):
|
|
186
|
+
# Phase signal
|
|
187
|
+
theta = np.sin(2 * np.pi * f_pha * t)
|
|
188
|
+
# Amplitude envelope
|
|
189
|
+
amplitude_env = 1 + np.sin(2 * np.pi * f_amp * t)
|
|
190
|
+
# Combine phase and amplitude modulation
|
|
191
|
+
signal = theta * amplitude_env
|
|
192
|
+
# Add Gaussian noise
|
|
193
|
+
signal += noise * np.random.randn(seq_len)
|
|
194
|
+
signals[b, ch, seg, :] = signal
|
|
195
|
+
|
|
196
|
+
return signals
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _demo_sig_tensorpac(
|
|
200
|
+
batch_size=8,
|
|
201
|
+
n_chs=19,
|
|
202
|
+
t_sec=4,
|
|
203
|
+
fs=512,
|
|
204
|
+
f_pha=10,
|
|
205
|
+
f_amp=100,
|
|
206
|
+
noise=0.8,
|
|
207
|
+
n_segments=20,
|
|
208
|
+
verbose=False,
|
|
209
|
+
):
|
|
210
|
+
n_times = int(t_sec * fs)
|
|
211
|
+
x_2d, tt = pac_signals_wavelet(
|
|
212
|
+
sf=fs,
|
|
213
|
+
f_pha=f_pha,
|
|
214
|
+
f_amp=f_amp,
|
|
215
|
+
noise=noise,
|
|
216
|
+
n_epochs=n_segments,
|
|
217
|
+
n_times=n_times,
|
|
218
|
+
)
|
|
219
|
+
x_3d = np.stack([x_2d for _ in range(batch_size)], axis=0)
|
|
220
|
+
x_4d = np.stack([x_3d for _ in range(n_chs)], axis=1)
|
|
221
|
+
return x_4d, tt
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _demo_sig_meg(batch_size=8, n_chs=19, t_sec=10, fs=512, verbose=False, **kwargs):
|
|
225
|
+
data_path = sample.data_path()
|
|
226
|
+
meg_path = data_path / "MEG" / "sample"
|
|
227
|
+
raw_fname = meg_path / "sample_audvis_raw.fif"
|
|
228
|
+
fwd_fname = meg_path / "sample_audvis-meg-eeg-oct-6-fwd.fif"
|
|
229
|
+
|
|
230
|
+
# Load real data as the template
|
|
231
|
+
raw = mne.io.read_raw_fif(raw_fname, verbose=verbose)
|
|
232
|
+
raw = raw.crop(tmax=t_sec, verbose=verbose)
|
|
233
|
+
raw = raw.resample(fs, verbose=verbose)
|
|
234
|
+
raw.set_eeg_reference(projection=True, verbose=verbose)
|
|
235
|
+
|
|
236
|
+
return raw.get_data(
|
|
237
|
+
picks=raw.ch_names[: batch_size * n_chs], verbose=verbose
|
|
238
|
+
).reshape(batch_size, n_chs, -1)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _demo_sig_periodic_1d(t_sec=10, fs=512, freqs_hz=None, verbose=False, **kwargs):
|
|
242
|
+
"""Returns a demo signal with the shape (t_sec*fs,)."""
|
|
243
|
+
|
|
244
|
+
if freqs_hz is None:
|
|
245
|
+
n_freqs = random.randint(1, 5)
|
|
246
|
+
freqs_hz = np.random.permutation(np.arange(fs))[:n_freqs]
|
|
247
|
+
if verbose:
|
|
248
|
+
print(f"freqs_hz was randomly determined as {freqs_hz}")
|
|
249
|
+
|
|
250
|
+
n = int(t_sec * fs)
|
|
251
|
+
t = np.linspace(0, t_sec, n, endpoint=False)
|
|
252
|
+
|
|
253
|
+
summed = np.array(
|
|
254
|
+
[
|
|
255
|
+
np.random.rand() * np.sin((f_hz * t + np.random.rand()) * (2 * np.pi))
|
|
256
|
+
for f_hz in freqs_hz
|
|
257
|
+
]
|
|
258
|
+
).sum(axis=0)
|
|
259
|
+
return summed
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _demo_sig_chirp_1d(
|
|
263
|
+
t_sec=10, fs=512, low_hz=None, high_hz=None, verbose=False, **kwargs
|
|
264
|
+
):
|
|
265
|
+
if low_hz is None:
|
|
266
|
+
low_hz = random.randint(1, 20)
|
|
267
|
+
if verbose:
|
|
268
|
+
warnings.warn(f"low_hz was randomly determined as {low_hz}.")
|
|
269
|
+
|
|
270
|
+
if high_hz is None:
|
|
271
|
+
high_hz = random.randint(100, 1000)
|
|
272
|
+
if verbose:
|
|
273
|
+
warnings.warn(f"high_hz was randomly determined as {high_hz}.")
|
|
274
|
+
|
|
275
|
+
n = int(t_sec * fs)
|
|
276
|
+
t = np.linspace(0, t_sec, n, endpoint=False)
|
|
277
|
+
x = chirp(t, low_hz, t[-1], high_hz)
|
|
278
|
+
x *= 1.0 + 0.5 * np.sin(2.0 * np.pi * 3.0 * t)
|
|
279
|
+
return x
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def _demo_sig_ripple_1d(t_sec=10, fs=512, **kwargs):
|
|
283
|
+
n_samples = t_sec * fs
|
|
284
|
+
t = simulate_time(n_samples, fs)
|
|
285
|
+
n_ripples = random.randint(1, 5)
|
|
286
|
+
mid_time = np.random.permutation(t)[:n_ripples]
|
|
287
|
+
return simulate_LFP(t, mid_time, noise_amplitude=1.2, ripple_amplitude=5)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
if __name__ == "__main__":
|
|
291
|
+
import scitex
|
|
292
|
+
|
|
293
|
+
# Start
|
|
294
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt)
|
|
295
|
+
import scitex
|
|
296
|
+
|
|
297
|
+
SIG_TYPES = [
|
|
298
|
+
"uniform",
|
|
299
|
+
"gauss",
|
|
300
|
+
"periodic",
|
|
301
|
+
"chirp",
|
|
302
|
+
"meg",
|
|
303
|
+
"ripple",
|
|
304
|
+
"tensorpac",
|
|
305
|
+
"pac",
|
|
306
|
+
]
|
|
307
|
+
|
|
308
|
+
i_batch, i_ch, i_segment = 0, 0, 0
|
|
309
|
+
fig, axes = scitex.plt.subplots(nrows=len(SIG_TYPES))
|
|
310
|
+
for ax, (i_sig_type, sig_type) in zip(axes, enumerate(SIG_TYPES)):
|
|
311
|
+
xx, tt, fs = demo_sig(sig_type=sig_type)
|
|
312
|
+
if sig_type not in ["tensorpac", "pac"]:
|
|
313
|
+
ax.plot(tt, xx[i_batch, i_ch], label=sig_type)
|
|
314
|
+
else:
|
|
315
|
+
ax.plot(tt, xx[i_batch, i_ch, i_segment], label=sig_type)
|
|
316
|
+
ax.legend(loc="upper left")
|
|
317
|
+
fig.suptitle("Demo signals")
|
|
318
|
+
fig.supxlabel("Time [s]")
|
|
319
|
+
fig.supylabel("Amplitude [?V]")
|
|
320
|
+
scitex.io.save(fig, "traces.png")
|
|
321
|
+
|
|
322
|
+
# Close
|
|
323
|
+
scitex.gen.close(CONFIG)
|
|
324
|
+
|
|
325
|
+
# EOF
|
|
326
|
+
|
|
327
|
+
"""
|
|
328
|
+
/home/ywatanabe/proj/entrance/scitex/dsp/_demo_sig.py
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
# EOF
|