Skip to content

Latest commit

 

History

History

0.15.2-0.16.0

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Comparing tmp/haniwers-0.15.2.tar.gz & tmp/haniwers-0.16.0.tar.gz

filetype from file(1)

@@ -1 +1 @@
-gzip compressed data, was "haniwers-0.15.2.tar", max compression
+gzip compressed data, was "haniwers-0.16.0.tar", max compression

Comparing haniwers-0.15.2.tar & haniwers-0.16.0.tar

file list

@@ -1,13 +1,13 @@
--rw-r--r--   0        0        0     1072 2023-05-17 08:20:30.907111 haniwers-0.15.2/LICENSE
--rw-r--r--   0        0        0     6942 2024-05-26 12:45:22.524830 haniwers-0.15.2/README.md
--rw-r--r--   0        0        0       23 2024-05-28 22:00:03.530327 haniwers-0.15.2/haniwers/__init__.py
--rw-r--r--   0        0        0    12494 2024-05-28 01:19:45.569454 haniwers-0.15.2/haniwers/cli.py
--rw-r--r--   0        0        0    16792 2024-05-27 02:58:41.796496 haniwers-0.15.2/haniwers/config.py
--rw-r--r--   0        0        0    22568 2024-05-28 01:19:45.569719 haniwers-0.15.2/haniwers/daq.py
--rw-r--r--   0        0        0     9820 2024-05-27 02:58:41.797488 haniwers-0.15.2/haniwers/dataset.py
--rw-r--r--   0        0        0     2618 2024-05-27 02:58:41.797813 haniwers-0.15.2/haniwers/mimic.py
--rw-r--r--   0        0        0      774 2024-05-22 14:19:28.812968 haniwers-0.15.2/haniwers/postprocess.py
--rw-r--r--   0        0        0    12810 2024-05-23 11:22:23.101251 haniwers-0.15.2/haniwers/preprocess.py
--rw-r--r--   0        0        0     8512 2024-05-27 02:58:41.798249 haniwers-0.15.2/haniwers/threshold.py
--rw-r--r--   0        0        0     1506 2024-05-28 22:00:03.531977 haniwers-0.15.2/pyproject.toml
--rw-r--r--   0        0        0     8443 1970-01-01 00:00:00.000000 haniwers-0.15.2/PKG-INFO
+-rw-r--r--   0        0        0     1072 2023-05-17 08:20:30.907111 haniwers-0.16.0/LICENSE
+-rw-r--r--   0        0        0     6942 2024-05-26 12:45:22.524830 haniwers-0.16.0/README.md
+-rw-r--r--   0        0        0       23 2024-06-01 11:33:35.326076 haniwers-0.16.0/haniwers/__init__.py
+-rw-r--r--   0        0        0    12960 2024-06-01 11:33:35.326605 haniwers-0.16.0/haniwers/cli.py
+-rw-r--r--   0        0        0    16792 2024-05-27 02:58:41.796496 haniwers-0.16.0/haniwers/config.py
+-rw-r--r--   0        0        0    28051 2024-06-01 11:33:35.326953 haniwers-0.16.0/haniwers/daq.py
+-rw-r--r--   0        0        0     9820 2024-05-27 02:58:41.797488 haniwers-0.16.0/haniwers/dataset.py
+-rw-r--r--   0        0        0     2965 2024-06-01 11:33:35.328010 haniwers-0.16.0/haniwers/mimic.py
+-rw-r--r--   0        0        0      774 2024-05-22 14:19:28.812968 haniwers-0.16.0/haniwers/postprocess.py
+-rw-r--r--   0        0        0    13030 2024-05-30 08:29:00.070036 haniwers-0.16.0/haniwers/preprocess.py
+-rw-r--r--   0        0        0     8814 2024-06-01 11:33:35.329144 haniwers-0.16.0/haniwers/threshold.py
+-rw-r--r--   0        0        0     1506 2024-06-01 11:33:35.330710 haniwers-0.16.0/pyproject.toml
+-rw-r--r--   0        0        0     8443 1970-01-01 00:00:00.000000 haniwers-0.16.0/PKG-INFO

Comparing haniwers-0.15.2/LICENSE & haniwers-0.16.0/LICENSE

  • Files identical despite different names

Comparing haniwers-0.15.2/README.md & haniwers-0.16.0/README.md

  • Files identical despite different names

Comparing haniwers-0.15.2/haniwers/cli.py & haniwers-0.16.0/haniwers/cli.py

  • Files 4% similar despite different names
@@ -6,45 +6,68 @@
 import pendulum
 import typer
 from loguru import logger
 
 from . import __version__
 
 
-def setup_logger(level="INFO") -> None:
+def setup_logger(level="INFO") -> Path:
+    """ロガーの設定"""
+
+    format_short = (" | ").join(
+        ["{time:YYYY-MM-DDTHH:mm:ss}", "<level>{level:8}</level>", "<level>{message}</level>"]
+    )
+    format_long = (" | ").join(
+        [
+            "{time:YYYY-MM-DDTHH:mm:ss}",
+            "<level>{level:8}</level>",
+            "<cyan>{name}.{function}:{line}</cyan>",
+            "<level>{message}</level>",
+        ]
+    )
+
     # ロガーをリセット
     logger.remove()
+
     # stderr用
-    logger.add(
-        sys.stderr,
-        format="{time:YYYY-MM-DDTHH:mm:ss} | <level>{level:8}</level> | <level>{message}</level>",
-        level=level,
-    )
+    if level in ["DEBUG"]:
+        logger.add(
+            sys.stderr,
+            format=format_long,
+            level=level,
+        )
+    else:
+        logger.add(
+            sys.stderr,
+            format=format_short,
+            level=level,
+        )
+
     # ファイル出力用
     p = PlatformDirs(appname="haniwers", version=__version__)
     fname = p.user_log_path / "haniwers_log.json"
-    logger.info(fname)
     logger.add(
         sink=fname,
-        format="{time:YYYY-MM-DDTHH:mm:ss} | <level>{level:8}</level> | <cyan>{name}.{function}:{line}</cyan> | <level>{message}</level>",
+        format=format_long,
         level="DEBUG",
         serialize=True,
         retention="10 days",
         rotation="1 MB",
     )
+    return fname
 
 
 app = typer.Typer()
 
 
 @app.command()
 def version(env: bool = False, log_level: str = "INFO"):
     """Show version."""
 
-    setup_logger(level=log_level)
+    fname = setup_logger(level=log_level)
 
     msg = f"haniwers {__version__}"
     print(msg)
     logger.debug(msg)
 
     if env:
         msg = f"Python: {platform.python_version()}"
@@ -55,14 +78,18 @@
         print(msg)
         logger.debug(msg)
 
         msg = f"OS: {platform.platform()}"
         print(msg)
         logger.debug(msg)
 
+        msg = f"Logs: {fname}"
+        print(msg)
+        logger.debug(msg)
+
         print("\n🤖 Please use 'poetry env info' to see more details.\n")
 
     return
 
 
 @app.command()
 def raw2tmp(

Comparing haniwers-0.15.2/haniwers/config.py & haniwers-0.16.0/haniwers/config.py

  • Files identical despite different names

Comparing haniwers-0.15.2/haniwers/daq.py & haniwers-0.16.0/haniwers/daq.py

  • Files 19% similar despite different names
@@ -6,14 +6,15 @@
 import pandas as pd
 import pendulum
 import serial
 from deprecated import deprecated
 from loguru import logger
 from pydantic import BaseModel
 from tqdm import tqdm
+from typing import TextIO, Generator
 
 from .config import Daq
 
 
 class RealEvent(BaseModel):
     """実イベント
 
@@ -105,22 +106,23 @@
         values = [f"{k}:{v}" for k, v in data]
         ltsv_string = ("\t").join(values)
         return ltsv_string
 
 
 @deprecated(version="0.15.0", reason="Use mkdir_saved")
 def init_saved(daq: Daq) -> None:
+    """(削除予定)"""
     logger.warning("Deprecated since 0.15.0: Use mkdir_saved")
     return mkdir_saved(daq)
 
 
 def mkdir_saved(daq: Daq) -> None:
-    """Initialize destination directory to save data files
+    """データを保存するディレクトリを作成
 
-    保存先のディレクトリを初期化します。
+    データを保存するディレクトリを初期化します。
     ディレクトリが存在しない場合は、新しく作成します。
     ディレクトリが存在する場合は、そのままにします。
 
     :Args:
     - daq(Daq): DAQ設定オブジェクト
     ```
     """
@@ -130,15 +132,15 @@
     msg = f"Save files to : {p}"
     logger.info(msg)
 
     return
 
 
 def get_savef(args: Daq, fid: int | str) -> Path:
-    """Get filename to save data
+    """(削除予定)データを保存するファイル名を生成する
 
     保存するファイル名を生成します。
     DAQ設定の接頭辞(``prefix``)と拡張子(``suffix``)の値を使って
     ``{prefix}_{連番:06}.{suffix}``の形式で生成します。
 
     :Args:
     - args(Daq): DAQ設定オブジェクト
@@ -161,15 +163,15 @@
     msg = "deprecation warning: use get_savef_with_timestamp instaed."
     logger.warning(msg)
 
     return savef
 
 
 def get_savef_with_timestamp(args: Daq, fid: int | str) -> Path:
-    """Get filename to save data with timestamp
+    """データを保存するファイル名を生成する(時刻付き)
 
     作成日を含んだファイル名を生成する。
     ファイル名は、DAQ設定の接頭辞(``prefix``)、ファイルを開いた時刻(``pendulum.now``)と
     拡張子(``suffix``)の値を使って生成する。
 
     時刻のフォーマットは、ファイル名が分かりやすいように独自フォーマットにした。
 
@@ -195,15 +197,15 @@
     stem = f"{args.prefix}_{ts}_{fid:07}"
     fname = Path(stem).with_suffix(args.suffix)
     savef = Path(args.saved, fname)
     return savef
 
 
 def open_serial_connection(daq: Daq) -> serial.Serial:
-    """Open and return a serial connection.
+    """シリアル通信を開始する
 
     シリアル通信(UART)に使うポートを準備します。
     ``with``構文で使う想定です。
 
     通信に使うUSBポート名(``device``)、
     ボーレート(``baudrate``)、
     通信開始/書き込みのタイムアウト秒(``timeout``)は
@@ -375,73 +377,37 @@
             return True
         msg = f"Retry: {i} / {max_retry} times."
         logger.warning(msg)
 
     return False
 
 
-@deprecated(
-    version="0.15.0",
-    reason="Will be deprecated. Use _read_serial_data_as_event with validation.",
-)
-def _read_serial_data_as_list(port: serial.Serial) -> list:
-    """(Will be deprecated) Read serial data from port.
+def _read_event(port: serial.Serial) -> RealEvent:
+    """OSECHIから1イベントを読み出す
 
     OSECHIが接続されているポートからデータを読み出します。
     引数に指定するポートは、あらかじめ開いたものを渡してください。
     ``run_daq``や``time_daq``でデータを取得するために使います。
 
     :Args:
     - port (serial.Serial): Serialオブジェクト
 
     :Returns:
-    - row (list): 読み出した時刻を追加したデータのリスト
+    - event (RealEvent): 読み出した時刻を追加したデータ
 
     :Examples:
     ```python
     >>> with open_serial_connection() as port:
-    >>>     row = read_serial_data(port)
-    >>>     row
-    [日付, top, mid, btm, adc, tmp, atm, hmd]
-    ```
-
-    """
-    msg = "Will be deprecated."
-    logger.warning(msg)
-    now = pendulum.now().to_iso8601_string()
-    data = port.readline().decode("UTF-8").strip()
-    if len(data) == 0:
-        msg = f"No data to readout. Timed-out: {port.timeout}"
-        logger.warning(msg)
-    row = f"{now} {data}".split()
-    return row
-
-
-def _read_serial_data_as_event(port: serial.Serial) -> RealEvent:
-    """Read serial data from port.
-
-    OSECHIが接続されているポートからデータを読み出します。
-    引数に指定するポートは、あらかじめ開いたものを渡してください。
-    ``run_daq``や``time_daq``でデータを取得するために使います。
-
-    :Args:
-    - port (serial.Serial): Serialオブジェクト
-
-    :Returns:
-    - row (list): 読み出した時刻を追加したデータのリスト
-
-    :Examples:
-    ```python
-    >>> with open_serial_connection() as port:
-    >>>     row = read_serialc_data(port)
-    >>>     row
-    [日付, top, mid, btm, adc, tmp, atm, hmd]
+    >>>     event = _read_event(port)
+    >>> event
+    [pendulum.now(), top, mid, btm, adc, tmp, atm, hmd]
     ```
 
     """
+    # logger.debug("[_read_event]")
     data = port.readline().decode("UTF-8").strip().split()
     if len(data) == 0:
         msg = f"No data to readout. Timed-out: {port.timeout}"
         logger.warning(msg)
     event = RealEvent()
     event.timestamp = pendulum.now()
     event.top = int(data[0])
@@ -450,111 +416,154 @@
     event.adc = int(data[3])
     event.tmp = float(data[4])
     event.atm = float(data[5])
     event.hmd = float(data[6])
     return event
 
 
-def read_serial_data(port: serial.Serial) -> list:
-    # data = _read_serial_data_as_list(port)
-    data = _read_serial_data_as_event(port)
-    return data.to_list_string()
-
+def _loop_events_for_rows(port: serial.Serial, max_rows: int) -> Generator[RealEvent, None, None]:
+    """イベント取得ループ(回数指定)
 
-def _loop_events(port: serial.Serial, rows: list) -> RealEvent:
-    """イベント取得ループ
+    指定した回数内にOSECHIからイベントを読み取るジェネレーター関数
 
     :Args:
     - `port (serial.Serial)`: 接続済みのSerialオブジェクト
-    - `rows (list)`: ループする回数
+    - `max_rows (int)`: イベントを読み取る最大回数
 
-    :Yield:
-    - event (RealEvent): OSECHIの測定データ
+    :Yields:
+    - `event (RealEvent)`: OSECHIの測定データ
 
     """
+    logger.success("[_loop_events_for_rows]")
+    rows = range(max_rows)
     for _ in tqdm(rows, leave=False, desc="loops"):
-        event = _read_serial_data_as_event(port)
+        event = _read_event(port)
         yield event
 
 
-def loop_and_save_events(f, daq: Daq, port: serial.Serial) -> list[RealEvent]:
-    rows = range(daq.max_rows)
-    events = []
-    for event in _loop_events(port, rows):
-        events.append(event.model_dump_json())
-        row = event.to_list_string()
-        if daq.suffix in [".csv"]:
-            row = event.to_csv_string()
-            f.write(row + "\n")
-        elif daq.suffix in [".dat", ".tsv"]:
-            row = event.to_tsv_string()
-            f.write(row + "\n")
-        elif daq.suffix in [".json", ".jsonl"]:
-            row = event.model_dump_json()
-            f.write(row + "\n")
-        f.flush()
-    return events
+def _loop_events_for_duration(
+    port: serial.Serial, max_duration: int
+) -> Generator[RealEvent, None, None]:
+    """イベント取得ループ(時間指定)
 
+    指定した時間内にOSECHIからイベントを読み取るジェネレーター関数
+
+    :Args:
+    - `port (serial.Serial)`: 接続済みのSerialオブジェクト
+    - `max_duration (int)`: イベントを読み取る最大時間(秒)
+
+    :Yields:
+    - `event (RealEvent)`: OSECHIの測定データ
 
-@deprecated(version="0.15.0", reason="Will be deprecated. Use loop_and_save_events instead.")
-def save_serial_data(f, daq: Daq, port: serial.Serial) -> list:
     """
+    logger.success("[_loop_events_for_duration]")
+    start = pendulum.now()
+    stop = start.add(seconds=max_duration)
+
+    logger.debug(f"- DAQ Started: {start}")
+    logger.debug(f"- DAQ Stop   : {stop}")
+
+    while pendulum.now() < stop:
+        event = _read_event(port)
+        yield event
+
+    end = pendulum.now()
+    diff = end - start
+    elapsed_time = diff.in_seconds()
+    logger.debug(f"- DAQ Closed : {end} / Elapsed: {elapsed_time} sec.")
+
+
+def loop_and_save(fname: Path, generator: Generator) -> list[RealEvent]:
+    """イベント保存ループ
+
+    ファイル名を指定して、イベントを保存します。
+    保存形式はファイル名の拡張子で判定します。
+    有効な拡張子は``[".csv", ".dat", ".tsv", ".json", ".jsonl"]``です。
+
+    イベントの取得方法は``generator``で指定します。
+    有効なジェネレーターは``[_loop_events_for_rows, _loop_events_for_duration]``です。
+
     :Args:
-    - f: ファイルポインタ
-    - daq (Daq): Daqオブジェクト
-    - port (serial.Serial): Serialオブジェクト
+    - fname (Path): データを追記するファイル名
+    - generator (Generator): イベントの取得方法 [`_loop_events_for_rows``, ``_loop_events_for_duration``]
 
-    :Return:
-    - rows (list[list]): 取得したデータのリスト
+    :Returns:
+    - events (list[RealEvent]): OSECHIの測定データのリスト
 
-    :TODO:
-    - Daqオブジェクトに依存しない関数にしたい(ジェネレーターにするのがいいのかな?)
-    - pd.DataFrameを返した方がいいかもしれない?
     """
-    max_rows = daq.max_rows
-    rows = []
-    for _ in tqdm(range(max_rows), leave=False, desc="rows"):
-        row = read_serial_data(port)
-        rows.append(row)
-        if daq.suffix == ".csv":
-            writer = csv.writer(f)
-            writer.writerow(row)
-        else:
-            writer = csv.writer(f, delimiter=" ")
-            writer.writerow(row)
-        f.flush()
-    return rows
+    suffix = fname.suffix
+    logger.success("[loop_and_save]")
+    events = []
+    with fname.open("x") as f:
+        for event in generator:
+            events.append(event)
+            if suffix in [".csv"]:
+                row = event.to_csv_string()
+                f.write(row + "\n")
+            if suffix in [".dat", ".tsv"]:
+                row = event.to_tsv_string()
+                f.write(row + "\n")
+            if suffix in [".json", ".jsonl"]:
+                row = event.model_dump_json()
+                f.write(row + "\n")
+            f.flush()
+    return events
 
 
 def run_daq(daq: Daq) -> None:
-    """メインDAQ
+    """DAQを実行する(回数指定)
 
     OSECHIが接続されたUSBポートとシリアル通信をして、データ取得する。
     指定したファイル数と行数をでループ処理する。
 
-    :TODO:
-    - 関数名をより適切なものに変えたい
-    - while_daq みたいなのを作ってもいいかもしれない
     """
     # Open serial connection
     with open_serial_connection(daq) as port:
         mkdir_saved(daq)
 
+        logger.debug(f"Port opend : {port.name}")
         for nfile in tqdm(range(daq.max_files), desc="files"):
             savef = get_savef_with_timestamp(daq, nfile)
             msg = f"Saving data to: {savef}."
             logger.info(msg)
             logger.info("Press Ctrl-c to stop.")
-
-            with savef.open("a") as f:
-                # save_serial_data(f, daq, port)
-                loop_and_save_events(f, daq, port)
-
+            loop_and_save(
+                fname=savef,
+                generator=_loop_events_for_rows(port=port, max_rows=daq.max_rows),
+            )
             msg = f"Saved data to: {savef}."
             logger.success(msg)
+    logger.debug(f"Port closed : {port.name}")
+
+
+def scan_daq(args: Daq, fname: str, duration: int) -> pd.DataFrame:
+    """DAQを実行する(時間指定)
+
+    :Args:
+    - args (Daq): Daqオブジェクト
+    - duration (int): 測定時間を秒で指定
+
+    :Returns:
+    - data (pd.DataFrame): 測定結果のデータフレーム
+    """
+
+    with open_serial_connection(args) as port:
+        mkdir_saved(args)
+
+        logger.debug(f"Port opened : {port.name}")
+        events = loop_and_save(
+            fname=Path(fname),
+            generator=_loop_events_for_duration(port=port, max_duration=duration),
+        )
+        msg = f"Saved data to: {fname}."
+        logger.success(msg)
+
+    logger.debug(f"Port closed : {port.name}")
+    # data = pd.DataFrame(rows)
+    return events
 
 
 def run(args: Daq):
     """メインのDAQ
 
     run_daqのラッパー。例外処理などで囲んだもの。
 
@@ -582,17 +591,20 @@
         Unaware error occurred.
         Please think if you need to handle this error.
         """
         logger.error(msg)
         sys.exit()
 
 
+"""削除予定の関数"""
+
+
+@deprecated(version="0.15.3", reason="Will be deprecated. Use scan_daq instead.")
 def time_daq(args: Daq, duration: int) -> pd.DataFrame:
-    """
-    測定時間を指定してDAQを走らせます。
+    """(削除予定)測定時間を指定してDAQを走らせます。
 
     :Args:
     - args (Daq): Daqオブジェクト
     - duration (int): 測定時間を秒で指定
 
     :Returns:
     - data (pd.DataFrame): 測定結果のデータフレーム
@@ -630,16 +642,15 @@
 
 
 @deprecated(
     version="0.14.0",
     reason="Will be deprecated. Use threshold.scan_threshold_by_channel instead.",
 )
 def scan_ch_vth(daq: Daq, duration: int, ch: int, vth: int) -> list:
-    """
-    Run threshold scan.
+    """(削除予定)Run threshold scan.
 
     :Args:
     - daq (Daq): Daqオブジェクト
     - duration (int): 測定時間(秒)
     - ch (int): 測定するチャンネル番号
     - vth (int): スレッショルド値
 
@@ -688,16 +699,15 @@
 
 
 @deprecated(
     version="0.14.0",
     reason="Will be deprecated. Use threshold.scan_thresholds instead.",
 )
 def scan_ch_thresholds(daq: Daq, duration: int, ch: int, thresholds: list[int]) -> list[list]:
-    """
-    Run threshold scan.
+    """(削除予定)Run threshold scan.
 
     :Args:
     - daq (Daq): Daqオブジェクト
     - duration (int): 測定時間(秒)
     - ch (int): チャンネル番号
     - thresholds (list[int]): スレッショルド値のリスト
 
@@ -724,7 +734,150 @@
         msg = "-" * 40 + f"[{i+1:2d}/{n:2d}: {vth}]"
         logger.info(msg)
         row = scan_ch_vth(daq, duration, ch, vth)
         if row:
             rows.append(row)
 
     return rows
+
+
+@deprecated(
+    version="0.15.0",
+    reason="Will be deprecated. Use _read_event (RealEvent).",
+)
+def _read_serial_data_as_list(port: serial.Serial) -> list:
+    """(削除予定)Read serial data from port.
+
+    OSECHIが接続されているポートからデータを読み出します。
+    引数に指定するポートは、あらかじめ開いたものを渡してください。
+    ``run_daq``や``time_daq``でデータを取得するために使います。
+
+    :Args:
+    - port (serial.Serial): Serialオブジェクト
+
+    :Returns:
+    - row (list): 読み出した時刻を追加したデータのリスト
+
+    :Examples:
+    ```python
+    >>> with open_serial_connection() as port:
+    >>>     row = read_serial_data(port)
+    >>>     row
+    [日付, top, mid, btm, adc, tmp, atm, hmd]
+    ```
+
+    """
+    msg = "Will be deprecated. Use _read_event."
+    logger.warning(msg)
+    now = pendulum.now().to_iso8601_string()
+    data = port.readline().decode("UTF-8").strip()
+    if len(data) == 0:
+        msg = f"No data to readout. Timed-out: {port.timeout}"
+        logger.warning(msg)
+    row = f"{now} {data}".split()
+    return row
+
+
+@deprecated(
+    version="0.15.0",
+    reason="Will be deprecated. Use _read_event (RealEvent).",
+)
+def read_serial_data(port: serial.Serial) -> list:
+    """(削除予定)"""
+    msg = "Will be deprecated. Use _read_event."
+    logger.warning(msg)
+    data = _read_serial_data_as_list(port)
+    return data
+
+
+@deprecated(version="0.15.3", reason="Will be deprecated. Use loop_and_save instead.")
+def _loop_and_save_events(
+    fname: Path, port: serial.Serial, max_rows: int, suffix: str = ".csv"
+) -> list:
+    """(削除予定)イベント保存ループ
+
+    :Args:
+    - `f (typing.TextIO)`: 開いたファイルオブジェクト
+    - `port (serial.Serial)` : 接続済みのSerialオブジェクト
+    - `max_rows (int)`: 1ファイルあたりの行数の最大値
+    - `suffix (str)`: ファイルの拡張子
+
+    :Return:
+    - `events (list)`: 複数イベントの測定データ
+
+    """
+    logger.warning("Will be deprecated. Use loop_and_save instead.")
+    events = []
+    with fname.open("x") as f:
+        for event in _loop_events_for_rows(port, max_rows):
+            events.append(event)
+            if suffix in [".csv"]:
+                row = event.to_csv_string()
+                f.write(row + "\n")
+            if suffix in [".dat", ".txv"]:
+                row = event.to_tsv_string()
+                f.write(row + "\n")
+            if suffix in [".json", ".jsonl"]:
+                row = event.model_dump_json()
+                f.write(row + "\n")
+            f.flush()
+    return events
+
+
+@deprecated(version="0.15.3", reason="Will be deprecated. Use _loop_and_save_events instead.")
+def loop_and_save_events(f: TextIO, daq: Daq, port: serial.Serial) -> list[str]:
+    """(削除予定)イベント保存ループ
+
+    :Args:
+    - f (TextIO): データを書き込むファイルオブジェクト
+    - daq (Daq): Daqオブジェクト
+    - port (serial.Serial): 接続済みのSerialオブジェクト
+
+    """
+    logger.warning("Will be deprecated. Use _loop_and_save_events instead.")
+    rows = daq.max_rows
+    events = []
+    for event in _loop_events_for_rows(port, max_rows=rows):
+        events.append(event.model_dump_json())
+        if daq.suffix in [".csv"]:
+            row = event.to_csv_string()
+            f.write(row + "\n")
+        elif daq.suffix in [".dat", ".tsv"]:
+            row = event.to_tsv_string()
+            f.write(row + "\n")
+        elif daq.suffix in [".json", ".jsonl"]:
+            row = event.model_dump_json()
+            f.write(row + "\n")
+        f.flush()
+    return events
+
+
+@deprecated(version="0.15.0", reason="Will be deprecated. Use _loop_and_save_events instead.")
+def save_serial_data(f, daq: Daq, port: serial.Serial) -> list:
+    """(削除予定)
+
+    :Args:
+    - f: ファイルポインタ
+    - daq (Daq): Daqオブジェクト
+    - port (serial.Serial): Serialオブジェクト
+
+    :Return:
+    - rows (list[list]): 取得したデータのリスト
+
+    :TODO:
+    - Daqオブジェクトに依存しない関数にしたい(ジェネレーターにするのがいいのかな?)
+    - pd.DataFrameを返した方がいいかもしれない?
+    """
+    logger.warning("Will be deprecated. Use _loop_and_save_events instead.")
+    max_rows = daq.max_rows
+    rows = []
+    for _ in tqdm(range(max_rows), leave=False, desc="rows"):
+        row = read_serial_data(port)
+        rows.append(row)
+        if daq.suffix == ".csv":
+            writer = csv.writer(f)
+            writer.writerow(row)
+        else:
+            writer = csv.writer(f, delimiter=" ")
+            writer.writerow(row)
+        f.flush()
+    return rows

Comparing haniwers-0.15.2/haniwers/dataset.py & haniwers-0.16.0/haniwers/dataset.py

  • Files identical despite different names

Comparing haniwers-0.15.2/haniwers/mimic.py & haniwers-0.16.0/haniwers/mimic.py

  • Files 4% similar despite different names
@@ -42,14 +42,28 @@
         self.tmp = random.gauss(mu=25.0, sigma=3) + random.gauss()
         self.atm = random.gauss(mu=101000, sigma=1000) + random.gauss()
         self.hmd = random.gauss(mu=50, sigma=15) + random.gauss()
 
         if self.top > 0:
             self.adc = random.randint(1, 1024)
 
+    def to_mock_string(self) -> str:
+        """モックしたデータ列
+
+        時刻が入ってないスペース区切りの文字列
+
+        :Example
+        ```
+        top mid btm adc tmp atm hmd
+        ```
+        """
+        values_ = self.to_list_string()[1:]
+        mock_string = (" ").join(values_)
+        return mock_string
+
 
 def fake_events_generator(n: int, seed: int | None = None, interval: str | int = "random"):
     """指定した回数のFakeEventを任意の間隔で生成する
 
     :Args:
         - n (int): 生成するFakeEventの数
         - seed (int | None) : 乱数シード。デフォルトは `None`

Comparing haniwers-0.15.2/haniwers/postprocess.py & haniwers-0.16.0/haniwers/postprocess.py

  • Files identical despite different names

Comparing haniwers-0.15.2/haniwers/preprocess.py & haniwers-0.16.0/haniwers/preprocess.py

  • Files 0% similar despite different names
@@ -77,24 +77,28 @@
     :Returns:
     - merged (pd.DataFrame): すべての測定データを結合したデータフレーム
     """
     names = ["datetime", "top", "mid", "btm", "adc", "tmp", "atm", "hmd"]
     data = []
     for fname in fnames:
         _suffix = fname.suffix
+        _stem = fname.stem
         if _suffix in [".dat"]:
             datum = pl.read_csv(
                 fname,
                 has_header=False,
                 new_columns=names,
                 separator=" ",
                 comment_char="t",
             )
         elif _suffix in [".csv"]:
-            datum = pl.read_csv(fname, has_header=False, new_columns=names)
+            if _stem.startswith("osechi_data"):
+                datum = pl.read_csv(fname, has_header=False, new_columns=names)
+            elif _stem.startswith("scan_data"):
+                datum = pl.read_csv(fname, has_header=False, new_columns=names, skip_rows=1)
         else:
             msg = f"Unknown suffix: {_suffix}"
             logger.warning(msg)
             break
         data.append(datum)
     merged = pl.concat(data).to_pandas().dropna(how="all")

Comparing haniwers-0.15.2/haniwers/threshold.py & haniwers-0.16.0/haniwers/threshold.py

  • Files 3% similar despite different names
@@ -6,15 +6,31 @@
 import pendulum
 from loguru import logger
 from scipy.optimize import curve_fit
 from scipy.special import erfc
 from pydantic import BaseModel
 
 from .config import Daq
-from .daq import get_savef_with_timestamp, set_vth_retry, time_daq
+from .daq import (
+    get_savef_with_timestamp,
+    set_vth_retry,
+    time_daq,
+    scan_daq,
+)
+
+
+def scan_threshold(args: Daq, fname: str, duration: int) -> pd.DataFrame:
+    events = scan_daq(args, fname, duration)
+    # logger.debug(events)
+    rows = []
+    for event in events:
+        rows.append(event.model_dump())
+    data = pd.DataFrame(rows)
+    # logger.debug(data)
+    return data
 
 
 def scan_threshold_by_channel(daq: Daq, duration: int, ch: int, vth: int) -> list:
     """
     Run threshold scan by channel.
 
     :Args:
@@ -31,23 +47,22 @@
     if not set_vth_retry(daq, ch, vth, 3):
         msg = f"Failed to set threshold: ch{ch} - {vth}"
         logger.error(msg)
         return []
 
     # Collect data
     try:
-        rows = time_daq(daq, duration)
+        # fidは7ケタまで使える
+        fid = f"{ch:02}_{vth:04}"
+        fname = get_savef_with_timestamp(daq, fid)
+        rows = scan_threshold(daq, fname, duration)
         counts = len(rows)
         tmp = rows["tmp"].mean()
         atm = rows["atm"].mean()
         hmd = rows["hmd"].mean()
-        # fidは7ケタまで使える
-        fid = f"{ch:02}_{vth:04}"
-        fname = get_savef_with_timestamp(daq, fid)
-        rows.to_csv(fname, index=False)
         msg = f"Saved data to: {fname}"
         logger.info(msg)
     except Exception as e:
         msg = f"Failed to collect data due to: {str(e)}"
         logger.error(msg)
         counts = 0
         tmp = 0

Comparing haniwers-0.15.2/pyproject.toml & haniwers-0.16.0/pyproject.toml

  • Files 16% similar despite different names
@@ -1,20 +1,20 @@
 [tool]
 [tool.commitizen]
 name = "cz_conventional_commits"
-version = "0.15.2"
+version = "0.16.0"
 tag_format = "$version"
 version_files = [
     "pyproject.toml:version",
     "haniwers/__init__.py:__version__",
 ]
 
 [tool.poetry]
 name = "haniwers"
-version = "0.15.2"
+version = "0.16.0"
 description = "Analysis tool for TanQ/FunQ project"
 authors = ["Shota Takahashi (KMI) <[email protected]>"]
 license = "MIT"
 readme = "README.md"
 homepage = "https://qumasan.gitlab.io/haniwers/docs/"
 repository = "https://gitlab.com/qumasan/haniwers/"
 keywords = ["muon"]

Comparing haniwers-0.15.2/PKG-INFO & haniwers-0.16.0/PKG-INFO

  • Files 0% similar despite different names
@@ -1,10 +1,10 @@
 Metadata-Version: 2.1
 Name: haniwers
-Version: 0.15.2
+Version: 0.16.0
 Summary: Analysis tool for TanQ/FunQ project
 Home-page: https://qumasan.gitlab.io/haniwers/docs/
 License: MIT
 Keywords: muon
 Author: Shota Takahashi (KMI)
 Author-email: [email protected]
 Requires-Python: >=3.9,<3.13